/*
 * ArchivoDocumentos.cpp
 *
 *  Created on: 29/05/2013
 *      Author: jonathan
 */

#include "ArchivoDocumentos.h"

ArchivoDocumentos::ArchivoDocumentos(const FileName nombreRepo, const FileName salida,
                                     fstream::openmode mode) {
    string filename = salida;
    filename.append("/nombresdoc.");
    filename.append(nombreRepo);
    this->stream = new BitStream(filename.c_str(), mode);
    this->compresor = new Compresor(stream);

}

void ArchivoDocumentos::escribir(list<EntradaDocumento>& lista) {
    list<EntradaDocumento>::iterator it;
    compresor->escribirDelta(lista.size());
    for (it = lista.begin(); it != lista.end(); it++) {
        EnteroLargo numero = (*it).getNro();
        if (numero==0)
            numero =1;
        compresor->escribirDelta(numero);
        string nombre = (*it).getNombre();
        compresor->escribirDelta(nombre.length());
        stream->fillByte();
        for (unsigned int i=0; i<nombre.length() ; ++i)
            stream->put(nombre[i]);
    }
    stream->close();
}

void ArchivoDocumentos::recuperarDatos() {
    EntradaDocumento* ent;
    EnteroLargo cant = compresor->leerDelta();
    InfoRepositorioActual::Instance()->setCantidadArchivos(cant);
    EnteroLargo cont = 0;

    EnteroLargo primernumero = 0;
    while(!stream->eof() && cont<cant) {
        EnteroLargo num = compresor->leerDelta();
        if (primernumero == 0) {
            num = primernumero;
            primernumero = 1;
        }
        EnteroLargo longitud = compresor->leerDelta();
        //saltar al prox byte
        stream->omitByte();
        string nombdoc = "";
        for (unsigned int i = 0; i<longitud ; i++) {
            char sal = stream->get();
            nombdoc.push_back(sal);
        }
        ent = new EntradaDocumento(num,nombdoc);
        this->listadocs.push_back(*ent);
        cont++;
    }
    EnteroLargo fc = compresor->leerDelta();
    InfoRepositorioActual::Instance()->setCantidadBloquesFC(fc);
    EnteroLargo ul = compresor->leerDelta();
    InfoRepositorioActual::Instance()->setCantidadUltimoBloque(ul);
    stream->close();
}

void ArchivoDocumentos::agregarDatosAdmin() {
    compresor->escribirDelta(InfoRepositorioActual::Instance()->getCantidadBloquesFC());
    compresor->escribirDelta(InfoRepositorioActual::Instance()->getCantidadUltimoBloque());
    stream->fillByte();
}

std::string ArchivoDocumentos::getDocumento(EnteroLargo num) {
    list<EntradaDocumento>::iterator it = listadocs.begin();
    bool encontrado = false;
    while (!encontrado && it != listadocs.end()) {
        if (it->getNro() == num) {
            encontrado = true;
            return it->getNombre();
        }
        it++;
    }
    return "numero incorrecto";
}

ArchivoDocumentos::~ArchivoDocumentos() {
    delete stream;
    delete compresor;
}
